package Streaming;

import java.util.List;
import java.util.Optional;
import java.util.OptionalInt;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @Author: 蔡翔
 * @Date: 2019/10/5 7:58
 * @Version 1.0
 */
public class StreamingDemo4 {
    public static void main(String[] args) {
        String str = "my name is 007";

        //使用并行流,因为是多线程排布的 所以不能保证顺序。
        str.chars().parallel().forEach(i->System.out.print((char)i));
        System.out.println("-------------------");
        //所以要forEachOrdered 来保证顺序。
        str.chars().parallel().forEachOrdered(i->System.out.print((char)i));

        //把源 数据收集成List
        //调用工具类 Collectors.toList() 把流收集成一个数组。
        List<String> collect = Stream.of(str.split(" ")).collect(Collectors.toList());  //注意collect是一个返回一个结果的。
        Object[] s = Stream.of(str.split(" ")).toArray();
        System.out.println("collect"+collect);
        for(Object i:s){
            System.out.println("toArray:"+i);
        }

        System.out.println("--------------------");
        //reduce， 使用reduce凭借字符串。
        //BinaryOperator<T> 表示是二元，两个输入，一个输出，输出是T类型的。
        //Optional<String> Optional是选项的意思，避免我们去做一些空判断。
        Optional<String> reduce = Stream.of(str.split(" ")).reduce((s1, s2) -> s1 + "|" + s2);
        //orElse 是当reduce为null的时候 就返回一个空串；
        System.out.println(reduce.orElse(""));

        //带初始化值的reduce
        String reduces = Stream.of(str.split(" ")).reduce("",((s1, s2) -> s1+"|"+s2));
        System.out.println(reduces);

        // 计算所有单词总长度。
        Integer length = Stream.of(str.split(" ")).map(sa->sa.length()).reduce(0,(s1,s2)->s1+s2);
        System.out.println("length:"+length);

        System.out.println("--------------------");
        // min/max
        //目的： 把流中最长的字符给计算出来（用 s1.length() 就说明是求最 长度 的最大值）
        Optional<String> max = Stream.of(str.split(" ")).max((s1,s2)->s1.length()-s2.length());
        System.out.println(max.orElse(""));

        // 使用findFirst短路操作
        OptionalInt first = new Random().ints().findFirst();
        System.out.println(first.getAsInt());
    }
}